package lvq;

public class Treino {

	private Rede rede;
	private Dados dados;

	private Grafico grafico;
	private boolean mostraGraficos;

	private double taxaAprendizagem;
	private int tempo = 1;

	public Treino(Rede rede, Dados dados, boolean mostraGraficos) {

		this.rede = rede;
		this.dados = dados;
		this.mostraGraficos = mostraGraficos;
	}

	public void treinaRede() {

		criaGrafico();

		taxaAprendizagem = 0.6;

		while (taxaAprendizagem > 0.001) {

			epoca();

			taxaAprendizagem = taxaAprendizagem * 0.5;
			tempo++;

		}

		System.out.println("fim");
	}

	private void criaGrafico() {

		if (mostraGraficos) {

			grafico = new Grafico(rede, dados);
			grafico.mostraDados();

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	private void epoca() {

		for (int i = 0; i < dados.quantidadeDados(); i++) {

			double[] coordenadasDado = dados.obtemCoordenadas(i);
			rede.treinaRede(coordenadasDado, taxaAprendizagem, tempo);
			atualizaGrafico();
			
		}
		
	}

	public void atualizaGrafico() {

		if (mostraGraficos) {
			grafico.repaint();

			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
